using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    [Header("相机目标")]
    public Transform target;
    public bool isLocalPlayer = true; // 是否为本地玩家

    [Header("基础相机设置")]
    public float distance = 5.0f;     // 相机与目标的距离
    public float height = 2.0f;       // 相机高度
    public float lookAtHeight = 1f; // 相机看向的高度
    public Vector3 offset = new Vector3(0f, 0f, 0f);

    [Header("相机旋转控制")]
    public float mouseSensitivity = 1000f; // 鼠标灵敏度

    [Header("瞄准模式设置")]
    public bool isAimed = false;        // 是否处于瞄准状态
    public float aimDistance = 2.0f;    // 瞄准状态下的相机距离
    public float aimHeight = 1.0f;      // 瞄准状态下的相机高度
    public float aimFOV = 60f;          // 瞄准状态下的FOV
    public float aimTransitionSpeed = 8.0f; // 瞄准状态切换速度

    [Header("相机碰撞检测")]
    public bool useCollision = false;    // 是否启用碰撞检测
    public float collisionRadius = 0.5f; // 碰撞检测半径
    public LayerMask collisionLayers;   // 碰撞检测层

    private float currentDistance;      // 当前相机距离
    private float currentHeight;        // 当前相机高度
    private float defaultFOV;           // 默认FOV
    private float currentVerticalAngle; // 当前垂直角度
    private float currentHorizontalAngle; // 当前水平角度
    private Camera mainCamera;

    void Start()
    {
        Initialized();
        
    }

    void LateUpdate()
    {
        if (target == null) return;

        // 处理输入（仅本地玩家）
        if (isLocalPlayer)
        {
            HandleInput();
        }

        // 更新相机位置和旋转
        UpdateCameraPosition();
    }

    void HandleInput()
    {
        // 鼠标旋转控制
        float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity;

        // 计算水平角度
        currentHorizontalAngle += mouseX;
        //Debug.Log(currentHorizontalAngle);

        // 瞄准模式切换
        if (Input.GetMouseButton(1)) // 右键
        {
            isAimed = true;
        }
        else if (Input.GetMouseButtonUp(1))
        {
            isAimed = false;
        }
    }

    void UpdateCameraPosition()
    {
        if (target == null) return;

        // 仅处理水平旋转（Y轴）
        Quaternion targetRotation = Quaternion.Euler(0f, currentHorizontalAngle, 0f);

        // 计算相机位置（基于四元数旋转，确保固定距离）
        Vector3 offset = targetRotation * (Vector3.back * distance);
        transform.position = target.position + Vector3.up * height + offset;

        // 相机看向目标
        Vector3 lookAtPosition = target.position + Vector3.up * lookAtHeight;
        transform.LookAt(lookAtPosition);

        // 更新FOV
        float targetFOV = isAimed ? aimFOV : defaultFOV;
        mainCamera.fieldOfView = Mathf.Lerp(mainCamera.fieldOfView, targetFOV, Time.deltaTime * aimTransitionSpeed);
    }

    Vector3 CheckCameraCollision(Vector3 fromPosition, Vector3 toPosition)
    {
        RaycastHit hit;

        // 从目标位置到相机位置发射射线，检测碰撞
        if (Physics.SphereCast(fromPosition, collisionRadius, (toPosition - fromPosition).normalized,
                              out hit, Vector3.Distance(fromPosition, toPosition), collisionLayers))
        {
            // 如果碰撞到物体，将相机位置调整到碰撞点
            return hit.point + hit.normal * 0.1f; // 添加小偏移防止相机嵌入物体
        }

        // 没有碰撞，返回原位置
        return toPosition;
    }

    public void Initialized()
    {
        defaultFOV = 60f;
        if (target == null) return;

        mainCamera = GetComponent<Camera>();

        // 初始化相机角度和距离
        Vector3 angles = transform.eulerAngles;
        currentVerticalAngle = 0f; // 固定垂直角度（俯仰角）
        currentHorizontalAngle = transform.eulerAngles.y; // 仅获取水平角度（Y轴）

        currentDistance = distance;
        currentHeight = height;
    }

    public void SetCamera()
    {
        if (mainCamera == null) { mainCamera = GetComponent<Camera>(); }
    }
}